/*
类的加载是从子类向上追溯到父类的过程，而初始化（尤其是静态初始化）是从父类向子类依次进行的。
对象的创建则从基类构造器开始，逐步向下完成实例变量初始化和构造器执行。
这一流程确保了继承体系中各层级类的正确初始化顺序。
 */
class BaseInsect {
    private int i = 1;
    protected int j;

    BaseInsect() {
        System.out.println("BaseInsect: i = " + i + ", j = " + j);
        j = 2;
    }

    private static int k = printInit("static BaseInsect.k initialized");

    static int printInit(String s) {
        System.out.println(s);
        return 3;
    }
}

public class Inheritance extends BaseInsect {
    private int k = printInit("Inheritance.k initialized");

    public Inheritance() {
        System.out.println("k = " + k);
        System.out.println("j = " + j);
    }

    private static int k2 = printInit("static Inheritance.k2 initialized");

    public static void main(String[] args) {
        Inheritance i = new Inheritance();
    }
}
/*
static BaseInsect.k initialized
static Inheritance.k2 initialized
BaseInsect: i = 1, j = 0
Inheritance.k initialized
k = 3
j = 2
 */
/*
类加载过程：
当运行一个 Java 程序时，JVM 会先加载包含 main 方法的类。
如果该类有基类（父类），则自动加载基类，即使没有创建其实例。
如果基类还有自己的基类，则递归加载，直到加载到最顶层的父类。

静态初始化顺序：
所有类加载后，先执行最顶层基类（BaseInsect）的静态初始化。
然后依次向下执行子类（Inheritance）的静态初始化。
静态初始化顺序保证子类静态代码依赖的基类成员已初始化。

对象创建过程：
类加载完成后，开始创建对象。
对象创建时，所有字段初始化为默认值（如 int 为 0，引用为 null）。
自动调用基类构造器（BaseInsect()），也可通过 super() 显指定。
基类构造器执行完成后，按字段声明顺序初始化子类实例变量。
最后执行子类构造器（Inheritance()）的主体逻辑。
 */